In [9]:
%pylab inline
#%numpy.linalg inline
%qtconsole
from mpl_toolkits.mplot3d import Axes3D
from ipywidgets import interact, interactive
from IPython.display import clear_output, display, HTML


Populating the interactive namespace from numpy and matplotlib
WARNING: pylab import has clobbered these variables: ['interactive']
`%matplotlib` prevents importing * from pylab and numpy

Un poquito de álgebra lineal

Para esta primera parte, utilizaremos una biblioteca muy útil para cálculo matricial, numpy. De allí sacaremos los tipos de dato ndarray, matrix, y todas las operaciones que utilicemos. Veamos un poco cómo definir vectores fila, matrices, y cómo llamar a determinado componente de determinado vector o matriz.


In [5]:
pos = array([1,4,3])
mat = matrix([[1,2,3], 
             [4,5,6], 
             [7,8,9]])

x = pos[0] # en Python, las posiciones de los vectores comienzan a contarse en 0
y = pos[1]
z = pos[2]
print 'suma de las componentes:', x+y+z, sum(pos)

c = (mat[0,0] + mat[0,1])* mat[1,1]
print 'operación con los elementos de la matriz:' , c

#Nos acostumbraremos a utilizar arrays para matrices
mat = array(mat) # La función array() transforma mat (que era una matrix) en un ndarray
print mat, type(mat)


suma de las componentes: 8 8
operación con los elementos de la matriz: 15
[[1 2 3]
 [4 5 6]
 [7 8 9]] <type 'numpy.ndarray'>

Las matrices especiales pueden armarse "a mano" como ejercicio, como también pueden buscarse entre las funciones que Python ofrece


In [6]:
identidad = zeros([3,3])
for i in range(3):
    for j in range(3):
        if i == j:
            identidad[i,j] = 1       
print 'identidad armada a mano: '
print identidad

identidad2 = identity(3)
print 'identidad de la función de Python: ' 
print identidad2

unos = ones([3,4]) #matriz de unos
print 'matriz de unos: '
print unos

ceros = zeros([4,3]) #matriz de ceros
print 'matriz de ceros: '
print ceros


identidad armada a mano: 
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]
identidad de la función de Python: 
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]
matriz de unos: 
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]
matriz de ceros: 
[[ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]]

Entre las operaciones que pueden hacerse con vectores y matrices se encuentran las que esperamos que estén: producto escalar, producto de matrices con vectores, transposición.


In [7]:
print 'teníamos la matriz: '
print mat

trans = transpose(mat)
print 'la traspuesta es: '
print trans

print 'vector pos=', pos

print 'producto escalar: ' , dot(pos, pos) # producto escalar entre vectores

print 'producto componente a componente:' , pos*pos # producto componente a componente. Más útil con funciones

A = array([[1,2],[0,1]]) #Otra forma de definir directamente matrices como arrays sin tener que transformar
x = array([1,2])
print 'A = ',A,'  ', 'x= ', x
print 'Ax=', dot(A, x)


teníamos la matriz: 
[[1 2 3]
 [4 5 6]
 [7 8 9]]
la traspuesta es: 
[[1 4 7]
 [2 5 8]
 [3 6 9]]
vector pos= [1 4 3]
producto escalar:  26
producto componente a componente: [ 1 16  9]
A =  [[1 2]
 [0 1]]    x=  [1 2]
Ax= [5 2]

Y también tenemos esas funciones que siempre quisimos tener desde el CBC: inversa de una matriz, cálculo de determinantes, resolución de sistema de ecuaciones, hallazgo de autovalores y autovectores. Para esto usamos una biblioteca extra llamada linalg


In [12]:
print 'Podemos encontrar la matriz inversa: ' 
print inv(A)

print 'su determinante:', det(A)
print 'Resolver un sistema de forma Ax=b'
b = x
print 'x =' ,solve(A, b)
print 'Y hallar autovalores y autovectores'
autoval, autovec = eig(A)
print 'Los autovalores: ', autoval
print 'Los autovectores: ', autovec


Podemos encontrar la matriz inversa: 
[[ 1. -2.]
 [ 0.  1.]]
su determinante: 1.0
Resolver un sistema de forma Ax=b
x = [-3.  2.]
Y hallar autovalores y autovectores
Los autovalores:  [ 1.  1.]
Los autovectores:  [[  1.00000000e+00  -1.00000000e+00]
 [  0.00000000e+00   1.11022302e-16]]

Funciones y gráficos

Lo siguiente que Python tiene de interesante para usar son sus facilidades para hacer gráficos. La biblioteca "matplotlib" nos ayudará en este caso. Primero, definimos un vector que nos hace de dominio, luego, un vector imagen de alguna función, y luego haremos el gráfico. Se muestran aquí algunas de las opciones que tiene matplotlib para presentar un gráfico, pero yendo a la documentación podrán encontrar infinidad de herramientas para hacer esto.


In [44]:
# Ploteos

x = linspace(-10, 10, 200) # con la función linspace generaremos un vector con componentes equidistantes.
y = x**2 # el vector imagen será igual de largo que x
plot(x,y, '-', color = 'red', label = 'Curva x**2') # ver qué pasa con 'r', 'g', '*' entre otros
title('Mi primer ploteo')
xlabel('Eje de las x')
ylabel('Eje de las y')
#xlim(-5,5)
#ylim(0,4)
legend('best')


Out[44]:
<matplotlib.legend.Legend at 0x7f4adaa19f90>

In [38]:
f = lambda x,n: sin(n*pi*x) # Definimos una sucesión de funciones trigonométricas
y = f(x,0) # vector imagen de la función f(x) = 0

for i in range(5): # este es un caso simple donde sumo las 5 primeras funciones de la sucesión
	y =  y + f(x,i) # a esa y le sumo el valor de las imágenes de las siguientes funciones de la sucesión de funciones

plot(x,y, label = 'Curva')
title('Suma de senos')
xlabel('Dominio')
ylabel('Suma de los primeros 5 senos')
legend('best')

# Podríamos hacer derivación numérica

# Integración sería útil?

# Transformada de Fourier es irse al chori?


Out[38]:
<matplotlib.legend.Legend at 0x7f4adaa9e6d0>

La importancia de las referencias


In [ ]: